package game;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

public class GamePanel extends JPanel implements MouseMotionListener {
    //读取英雄机的图片
    ImageIcon heroImage = new ImageIcon("img/hero.png");
    //英雄机坐标
    int heroX = 300;
    int heroY = 500;
    private int number;//记录分数
    //定义一个集合来装所有敌机
    private List<Enemy> enems = new ArrayList<Enemy>();//定义一个集合来装所有的敌机
    //定义一个集合来装所有子弹对象
    private List<Bullet> bullets = new ArrayList<Bullet>();
    //定义一个集合用来装爆炸图片
    private List<Bomb> bombs =new ArrayList<Bomb>();

    public GamePanel() {//创建十个敌人
        for (int i = 0; i < 10; i++) {
            enems.add(new Enemy());
        }
    }
    //鼠标按键在组件上按下并拖动时调用
    @Override
    public void mouseDragged(MouseEvent e) {
        heroX = e.getX() - (heroImage.getIconWidth() / 2);//使鼠标与战机重合
        heroY = e.getY() - (heroImage.getIconHeight() / 2);//把鼠标的y赋值
        repaint();//重新绘制
    }
    //鼠标光标移动到组件上但无按键按下时调用
    @Override
    public void mouseMoved(MouseEvent e) {
        heroX = e.getX() - (heroImage.getIconWidth() / 2);
        heroY = e.getY() - (heroImage.getIconHeight() / 2);
        repaint();
    }

    /**
     * 绘制图片 这个方法是窗口对象来调用
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawString("ZJZ and YZJ", 250, 30);

        //绘制分数板
        g.setFont(new Font("", Color.RED.getRed(), 30));
        g.drawString("当前得分:"+number, 20, 30);

        //1.绘制英雄机
        //g.drawImage(heroImage.getImage(), 350, 0, null);


        g.drawImage(heroImage.getImage(), heroX, heroY, null);
        //2.绘制敌机
        for (int i = 0; i < enems.size(); i++) {
            Enemy enemy = enems.get(i);
            enemy.drawImage(g);//重新绘制

        }
        //3.绘制子弹
        for (int i = 0; i < bullets.size(); i++) {
            Bullet bullet=bullets.get(i);
            bullet.drawImage(g);
        }
        //4.绘制爆炸图片
        for(int i=0;i<bombs.size();i++){
            Bomb bomb = bombs.get(i);
            bomb.drawImage(g);
        }
    }

    /**
     * 这个方法做初始化使用
     * 创建一些组件（英雄机，子弹，敌人）
     */
    public void init() {
        int flag=0;//控制子弹流出的速度

        while (true) {
            flag++;
            if(flag % 15 ==0) {
                //创建一些子弹
                Bullet bullet = new Bullet(heroX + (heroImage.getIconWidth() / 2), heroY);
                //把子弹添加到集合
                bullets.add(bullet);
            }
            //让敌机往下移动
            for (int i = 0; i < enems.size(); i++) {
                Enemy enemy = enems.get(i);
                enemy.move();//改变敌机的y坐标

                //判断敌机的y值是否大于窗口的高夫
                if(enemy.getY()>GameMain.height){
                    //删除敌机
                    enems.remove(enemy);
                    //再加一个新的敌机
                    enems.add(new Enemy());
                }
            }
            //让子弹飞起来
            for (int i = 0; i < bullets.size(); i++) {
                Bullet tempBullet = bullets.get(i);
                tempBullet.move();

            }
            //删除越界子弹数
            for (int i = 0; i < bullets.size(); i++) {
                Bullet bullet=bullets.get(i);
                if(bullet.getY()<0){//越界
                    bullets.remove(bullet);
                }
            }
            //处理子弹碰到敌机的效果
            for (int i = 0; i < enems.size(); i++) {
                Enemy enemy=enems.get(i);//敌机

                for (int j = 0; j < bullets.size(); j++) {
                    Bullet bullet=bullets.get(j);//子弹
                    if(isHit(enemy,bullet)){
                        enems.remove(enemy);//先删除集中的敌机
                        enems.add(new Enemy());//再加入敌机
                        bullets.remove(bullet);//删除子弹

                        //创建一个爆炸图片的对象
                        Bomb bomb=new Bomb(enemy.getY(),enemy.getY());//爆炸的地方是敌机被消灭的地方
                        bombs.add(bomb);//添加到集合中
                        number+=10;//每次碰撞加十分
                    }
                }
            }
            for (int i = 0; i < bombs.size(); i++) {
                Bomb bomb=bombs.get(i);
                bomb.delete();//立马删看不到效果，删五次
                if(bomb.getFlag()>10){
                    bombs.remove(bomb);//删集合
                }
            }

            repaint();//重新绘制，使图片动起来

            try {//休眠五毫秒，否则我们看不见
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    //碰撞方法
    public boolean isHit(Enemy e, Bullet b){
        // 1.指定一个区域
        Rectangle rect = new Rectangle(e.getX(), e.getY(), e.getWidth(), e.getHeight());

        // 2.表示 (x,y) 坐标空间中的位置的点
        Point p = new Point(b.getX()+b.getWidth()/2,b.getY()+b.getHeight()/2);

        return rect.contains(p);//敌机包含子弹
    }
}
